---
title: Introduction to development builds
sidebar_title: Introduction
description: A better development environment for React Native apps.
---

import { BookOpen02Icon } from '@expo/styleguide-icons/outline/BookOpen02Icon';
import { VideoRecorderIcon } from '@expo/styleguide-icons/outline/VideoRecorderIcon';

import { BoxLink } from '~/ui/components/BoxLink';
import { Collapsible } from '~/ui/components/Collapsible';
import { ContentSpotlight } from '~/ui/components/ContentSpotlight';

A **development build** is a debug build of your app that contains the [`expo-dev-client`](/versions/latest/sdk/dev-client/) package. By using development builds instead of [Expo Go](/get-started/set-up-your-environment/), you gain full control over the native runtime, so you can [install any native libraries](/workflow/using-libraries/#determining-third-party-library-compatibility), [modify any project configuration](/config-plugins/introduction/), or [write your own native code](/modules/get-started/). With Expo development builds, you are building your own native app, while with Expo Go you are running your project in a sandboxed native app environment.

<ContentSpotlight
  alt="expo-dev-client launcher and menu UIs on Android and iOS"
  src="/static/images/dev-client/preview.png"
  caption={`When you run a development build it will look like this, only with your app name and icon included rather than "Microfoam". The launcher UI is pictured in iOS on the left and Android on the right. In between, you can see an app running inside of the development build, with the customizable developer menu open.`}
/>

The [`expo-dev-client`](/versions/latest/sdk/dev-client/) package replaces the default in-app development tools UI that React Native provides with [a more powerful and extensible in-app UI](/debugging/tools/#developer-menu), adds [support for network debugging](/debugging/tools/#inspecting-network-requests), adds support for [launching updates](/eas-update/expo-dev-client/) (such as from [PR previews](/develop/development-builds/development-workflows/#pr-previews)), and adds a launcher UI.

The launcher UI makes it possible to switch between development servers without needing to rebuild the app binary. This works great alongside [Continuous Native Generation (CNG)](/workflow/continuous-native-generation/) because you can generate a single development build whenever you modify the native code in your app, and then you can iterate on the JavaScript code without needing to rebuild the native code until the next time that you need to modify it. It also works great without CNG — this approach is very well suited to teams that have specialized native engineers who work on the native runtime and application developers that specialize in React to [achieve web-like iteration speeds](https://blog.expo.dev/javascript-driven-development-with-custom-runtimes-eda87d574c9d) with native apps, without compromise.

<BoxLink
  title="Get started with development builds using EAS Build"
  description="The easiest way to get started with development builds is to use EAS Build to build your app in the cloud, because you do not need to install any native build tools locally."
  href="/develop/development-builds/create-a-build/"
  Icon={BookOpen02Icon}
/>

<BoxLink
  title="Get started with development builds in a local development environment"
  description="This guide covers the basics of building your app for development, and provides instructions on how to configure your environment."
  href="/guides/local-app-development/"
  Icon={BookOpen02Icon}
/>

<BoxLink
  title="Develop an app with Expo"
  description="An overview of the development process of building an Expo app to help build a mental model of the core development loop. See where development builds fit in."
  href="/workflow/overview/"
  Icon={BookOpen02Icon}
/>

<BoxLink
  title="Getting the most out of Expo Development Builds"
  description="A YouTube video that explains what a development build is, why it is important, and how to use it."
  href="https://www.youtube.com/watch?v=7J8LRpja9_o"
  Icon={VideoRecorderIcon}
/>

## Frequently asked questions

<Collapsible summary="What is a native runtime?">

**A native runtime** refers to the runtime environment that your JavaScript application code is executed in. If your development build is compiled with `expo-camera` installed, the native runtime will include the appropriate code so that you can access that functionality from JavaScript. If the build was not compiled with `expo-camera`, then you cannot access that code from your JavaScript code. Different versions of your app runtime are managed with a [runtime version](/eas-update/runtime-versions/) configuration field.

</Collapsible>

<Collapsible summary="How are development builds different from Expo Go?">

When you start a new project with Expo, the fastest and easiest way to get to "Hello, world!" is with [Expo Go](/get-started/set-up-your-environment/) on your device because you don't need to compile any native code or install any native tooling.

Beyond "Hello, world!" and prototypes, you'll quickly encounter limitations and need to build a development build of your app. For example, the Expo Go sandbox environment is limited to only the native packages included in the [Expo SDK](/versions/latest/), while you can include any library in a development build because it's just a normal native app.

You can think of a development build as your fully customizable version of Expo Go, tailored specifically for your project. Or, conversely, Expo Go is a development environment with a preset runtime.

</Collapsible>

<Collapsible summary="What other types of builds are there?">

- A [production build](/deploy/build-project/) is for the general public, deployed through stores.
- A [preview build](/build/internal-distribution/) lets your team test your next release, either by installing an APK directly on Android or using ad hoc or enterprise provisioning on iOS.

</Collapsible>
